# uncompyle6 version 3.2.3
# Python bytecode 3.6 (3379)
# Decompiled from: Python 3.6.8 |Anaconda custom (64-bit)| (default, Feb 21 2019, 18:30:04) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: site-packages\urllib3\filepost.py
from __future__ import absolute_import
import codecs
from uuid import uuid4
from io import BytesIO
from .packages import six
from .packages.six import b
from .fields import RequestField

writer = codecs.lookup("utf-8")[3]


def choose_boundary():
    """
    Our embarrassingly-simple replacement for mimetools.choose_boundary.
    """
    return uuid4().hex


def iter_field_objects(fields):
    """
    Iterate over fields.
    
    Supports list of (k, v) tuples and dicts, and lists of
    :class:`~urllib3.fields.RequestField`.
    
    """
    if isinstance(fields, dict):
        i = six.iteritems(fields)
    else:
        i = iter(fields)
    for field in i:
        if isinstance(field, RequestField):
            yield field
        else:
            yield RequestField.from_tuples(*field)


def iter_fields(fields):
    """
    .. deprecated:: 1.6
    
    Iterate over fields.
    
    The addition of :class:`~urllib3.fields.RequestField` makes this function
    obsolete. Instead, use :func:`iter_field_objects`, which returns
    :class:`~urllib3.fields.RequestField` objects.
    
    Supports list of (k, v) tuples and dicts.
    """
    if isinstance(fields, dict):
        return ((k, v) for k, v in six.iteritems(fields))
    else:
        return ((k, v) for k, v in fields)


def encode_multipart_formdata(fields, boundary=None):
    """
    Encode a dictionary of ``fields`` using the multipart/form-data MIME format.
    
    :param fields:
        Dictionary of fields or list of (key, :class:`~urllib3.fields.RequestField`).
    
    :param boundary:
        If not specified, then a random boundary will be generated using
        :func:`mimetools.choose_boundary`.
    """
    body = BytesIO()
    if boundary is None:
        boundary = choose_boundary()
    for field in iter_field_objects(fields):
        body.write(b("--%s\r\n" % boundary))
        writer(body).write(field.render_headers())
        data = field.data
        if isinstance(data, int):
            data = str(data)
        if isinstance(data, six.text_type):
            writer(body).write(data)
        else:
            body.write(data)
        body.write(b"\r\n")

    body.write(b("--%s--\r\n" % boundary))
    content_type = str("multipart/form-data; boundary=%s" % boundary)
    return (body.getvalue(), content_type)
